{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Unix 哲学"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "思考 - 差异（多个对象）\n",
    "\n",
    "转化 - 优缺（单个对象）\n",
    "\n",
    "\n",
    "[Unix哲学 - 维基百科，自由的百科全书](https://zh.wikipedia.org/wiki/Unix%E5%93%B2%E5%AD%A6)\n",
    "\n",
    "[帕累托法则 - 维基百科，自由的百科全书- 80/20 法则、关键少数法则](https://zh.wikipedia.org/wiki/%E5%B8%95%E7%B4%AF%E6%89%98%E6%B3%95%E5%88%99)\n",
    "\n",
    "\n",
    "- <font color=red size=3>程序应该只关注一个目标，并尽可能把它做好。</font>\n",
    "\n",
    "- <font color=orange size=3>让程序能够互相协同工作。</font>\n",
    "\n",
    "- <font color=blue size=3>应该让程序处理文本数据流，因为这是一个通用的接口。</font>\n",
    "    \n",
    "程序精心设计，能被其他程序启动，这样的程序比单独使用它们自己的代码更强大。 \n",
    "\n",
    "软件设计原则：编写小的、目的有限的、能互操作的程序，胜过大的、功能丰富的应用程序。\n",
    "\n",
    "较小的程序更容易理解，通过能够互操作，它们可以是更强大的应用程序的构建块。\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Python精要"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 对象\n",
    "\n",
    "程序中的一切数据都是对象: \n",
    "\n",
    "- 对象包括自定义对象及基本的数据类型如数值、字符串、列表、字典等。\n",
    "\n",
    "- 你能够以类或扩展类型的方式创建自定义对象\n",
    "\n",
    "\n",
    "每个对象都有三个基本属性:\n",
    "\n",
    "- 标识(类似人的标识证号)-id()\n",
    "\n",
    "- 类型 - type()\n",
    "\n",
    "- 值\n",
    "\n",
    "\n",
    "一个对象的类别决定了可以对该对象进行何种操作(如，这个对象有长度吗?)。\n",
    "\n",
    "- 当一个特定类型的对象被创建时，这个对象被称为该类型的一个实例(注意：不要将类型的的实例和用户自定义类的实例混淆)。\n",
    "\n",
    "- 在一个对象被创建之后，它的标识和类型就再不能被改变。\n",
    "\n",
    "- 某些对象的值是可变的，这些对象就被称为可变对象(mutable);另一些对象的值是不可变的，那就被称为不变对象(immutable)。\n",
    "\n",
    "\n",
    "- 某类对象可以包含其它对象的引用(这里的<font color=red size=5>引用</font>可以理解为<font color=red size=5>该对象的内存地址</font>)，我们称这类对象为容器\n",
    "\n",
    "- 一个对象是否可变取决于它的类型，举例来说，数字、字符串、 tuple类型是不可变类型，字典与列表是可变类型。\n",
    "\n",
    "\n",
    "除了保存值以外，许多对象还拥有一系列的属性(attribute)。\n",
    "\n",
    "- 广义的属性是指<font color=red>对象的相关</font>数据或者该对象能够具有的行为（如狗对象拥有颜色体重等相关数据，还拥有叫、吃、跑等行为，这些都是对象的广义的属性）\n",
    "\n",
    "- 狭义的属性<font color=blue>只包含对象的相关</font>数据，对于对象的行为，更常用的叫法是方法(method)。方法是对象可调用的属性，一个对象有多少个方法(method)，它就具有多少种行为\n",
    "\n",
    "- 要访问一个对象的属性或者调用一个对象方法，使用点(.)操作符\n",
    "\n",
    "## 引用计数与垃圾收集\n",
    "\n",
    "- 一切对象都是引用计数的。\n",
    "\n",
    "当分配一个新的名字给一个对象，或者其将放入到一个容器比如列表、元组、或者字典中，该对象的引用计数就会增加1次\n",
    "\n",
    "del语句、脱离变量作用域或者变量被重新定义，都会使对象的引用计数减少\n",
    "\n",
    "当一个对象的引用计数减少至零时，它就会在适当时机被垃圾回收车拉走\n",
    "\n",
    "- 对象都无法通过名字访问\n",
    "\n",
    "若对象都无法通过名字访问，但引用计数并没有减少到零， 它会一直驻留在内存中，这就造成了内存泄漏。\n",
    "\n",
    "为解决这个问题， Python解释器会定期的运行一个搜索器，若发现一个对象已经无法被访问，不论该对象引用计数是否为 0 ，都销毁它\n",
    "\n",
    "搜索器的算法可以通过 gc 模块的函数来进行调整和控制\n",
    "\n",
    "## 引用与副本\n",
    "\n",
    "运行语句 a = b 时，就创建了对象 b 的一个新引用a。\n",
    "\n",
    "对于不可变对象(数字或字符串等)，改变对象的一个引用就会创建一个新对象。\n",
    "\n",
    "两种方法用来创建可变对象的副本：\n",
    "\n",
    "- 浅复制(shallow copy)\n",
    "\n",
    "浅复制创建一个新对象，但它包含的子元素仍然是原来对象子元素的引用\n",
    "\n",
    "a 和 b 虽然是彼此独立的对象，但他们包含的元素却是共享的\n",
    "\n",
    "- 深复制(deep copy)\n",
    "\n",
    "深复制创建一个新对象，并递归复制所有子对象\n",
    "\n",
    "\n",
    "![image-20210214214456460](https://gitee.com/ld269440877/images/raw/master/notebook/20210214214456.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# [pprint-读写组织文件-调试](pprint-读写组织文件-调试.ipynb)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# [从Web抓取信息](从Web抓取信息.ipynb)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# [Excel-word-pdf-json-csv](Excel-word-pdf-json-csv.ipynb)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# [保持时间、计划任务和启动程序](保持时间、计划任务和启动程序.ipynb)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# [发送电子邮件和短信](发送电子邮件和短信.ipynb)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# [图形用户界面自动化--用GUI自动化控制键盘和鼠标](图形用户界面自动化--用GUI自动化控制键盘和鼠标.ipynb)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# [操作图像](操作图像.ipynb)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[参考书：python编程快速上手-让繁琐工作自动化.pdf](python编程快速上手-让繁琐工作自动化.pdf)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"https://gitee.com/ld269440877/images/raw/master/notebook/20210212000421.png\" alt=\"image-20210212000421504\" style=\"zoom:25%;\" />"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# import"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "IPython.notebook.set_autosave_interval(60000)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Autosaving every 60 seconds\n"
     ]
    },
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'PyPDF2'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-1-619b7bc94c7b>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m     37\u001b[0m \u001b[1;31m# from openpyxl.drawing.image import Image\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     38\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 39\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mPyPDF2\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     40\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mdocx\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     41\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mcsv\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'PyPDF2'"
     ]
    }
   ],
   "source": [
    "%autosave 60\n",
    "\n",
    "import os\n",
    "import sys\n",
    "import pprint\n",
    "import math\n",
    "import string\n",
    "import time\n",
    "import datetime\n",
    "import random\n",
    "\n",
    "\n",
    "import pprint\n",
    "import shelve\n",
    "import shutil\n",
    "import send2trash\n",
    "import zipfile\n",
    "import traceback\n",
    "\n",
    "\n",
    "import selenium\n",
    "import requests\n",
    "import bs4\n",
    "import webbrowser\n",
    "from selenium import webdriver\n",
    "from selenium.webdriver.common.keys import Keys\n",
    "import chardet\n",
    "\n",
    "import openpyxl\n",
    "from openpyxl.cell.cell import get_column_letter # , column_index_from_string\n",
    "from openpyxl.cell.cell import Cell\n",
    "from openpyxl.styles import cell_style, fonts , colors, \\\n",
    "PatternFill, Font, Alignment, Border, Side\n",
    "\n",
    "\n",
    "\n",
    "# from openpyxl.drawing.image import Image\n",
    "\n",
    "# import PyPDF2\n",
    "import docx\n",
    "import csv\n",
    "import json\n",
    "\n",
    "import threading\n",
    "import subprocess\n",
    "\n",
    "from PIL import Image\n",
    "\n",
    "from dir_objectName import dir_objectName\n",
    "\n",
    "import logging\n",
    "logging.basicConfig(level=logging.INFO,\n",
    "                    format=\" %(asctime)s - %(levelname)s - %(message)s \")\n",
    "#!/Users/mach711/myproject/venv_python3/bin/python"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[41m31@\u001b[0malignment                     \u001b[41m32@\u001b[0mbase_date                     \n",
      "\u001b[41m33@\u001b[0mborder                        \u001b[41m34@\u001b[0mcheck_error                   \u001b[41m35@\u001b[0mcheck_string                  \u001b[41m36@\u001b[0mcol_idx                       \n",
      "\u001b[41m37@\u001b[0mcolumn                        \u001b[41m38@\u001b[0mcolumn_letter                 \u001b[41m39@\u001b[0mcomment                       \u001b[41m40@\u001b[0mcoordinate                    \n",
      "\u001b[41m41@\u001b[0mdata_type                     \u001b[41m42@\u001b[0mencoding                      \u001b[41m43@\u001b[0mfill                          \u001b[41m44@\u001b[0mfont                          \n",
      "\u001b[41m45@\u001b[0mhas_style                     \u001b[41m46@\u001b[0mhyperlink                     \u001b[41m47@\u001b[0minternal_value                \u001b[41m48@\u001b[0mis_date                       \n",
      "\u001b[41m49@\u001b[0mnumber_format                 \u001b[41m50@\u001b[0moffset                        \u001b[41m51@\u001b[0mparent                        \u001b[41m52@\u001b[0mpivotButton                   \n",
      "\u001b[41m53@\u001b[0mprotection                    \u001b[41m54@\u001b[0mquotePrefix                   \u001b[41m55@\u001b[0mrow                           \u001b[41m56@\u001b[0mstyle                         \n",
      "\u001b[41m57@\u001b[0mstyle_id                      \u001b[41m58@\u001b[0mvalue                         "
     ]
    }
   ],
   "source": [
    "dir_objectName(Cell)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[41m1@@\u001b[0mCell                                    \u001b[41m2@@\u001b[0mERROR_CODES                             \u001b[41m3@@\u001b[0mHyperlink                               \n",
      "\u001b[41m4@@\u001b[0mILLEGAL_CHARACTERS_RE                   \u001b[41m5@@\u001b[0mIllegalCharacterError                   \u001b[41m6@@\u001b[0mKNOWN_TYPES                             \n",
      "\u001b[41m7@@\u001b[0mMergedCell                              \u001b[41m8@@\u001b[0mNUMERIC_TYPES                           \u001b[41m9@@\u001b[0mSTRING_TYPES                            \n",
      "\u001b[41m10@\u001b[0mStyleableObject                         \u001b[41m11@\u001b[0mTIME_FORMATS                            \u001b[41m12@\u001b[0mTIME_TYPES                              \n",
      "\u001b[41m13@\u001b[0mTYPE_BOOL                               \u001b[41m14@\u001b[0mTYPE_ERROR                              \u001b[41m15@\u001b[0mTYPE_FORMULA                            \n",
      "\u001b[41m16@\u001b[0mTYPE_FORMULA_CACHE_STRING               \u001b[41m17@\u001b[0mTYPE_INLINE                             \u001b[41m18@\u001b[0mTYPE_NULL                               \n",
      "\u001b[41m19@\u001b[0mTYPE_NUMERIC                            \u001b[41m20@\u001b[0mTYPE_STRING                             \u001b[41m21@\u001b[0mTimestamp                               \n",
      "\u001b[41m22@\u001b[0mVALID_TYPES                             \u001b[41m23@\u001b[0mWriteOnlyCell                           \u001b[41m34@\u001b[0mcopy                                    \u001b[41m35@\u001b[0mdatetime                                \u001b[41m36@\u001b[0mdeprecated                              \n",
      "\u001b[41m37@\u001b[0mget_column_letter                       \u001b[41m38@\u001b[0mget_type                                \u001b[41m39@\u001b[0mis_date_format                          \n",
      "\u001b[41m40@\u001b[0mnumbers                                 \u001b[41m41@\u001b[0mre                                      "
     ]
    }
   ],
   "source": [
    "dir_objectName(objectName=openpyxl.cell.cell, column=3, width=40, startsWith='_')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# git auto-pull-push"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "IPython.notebook.set_autosave_interval(60000)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Autosaving every 60 seconds\n"
     ]
    }
   ],
   "source": [
    "%autosave 60\n",
    "import subprocess\n",
    "import os\n",
    "import datetime\n",
    "from logger import logger"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 2021-02-12 23:05:27,143 - INFO - p.stdout.readlines():\n",
      " \n"
     ]
    }
   ],
   "source": [
    "logging.info(\"p.stdout.readlines():\\n\")\n",
    "with subprocess.Popen(['python.exe', 'automatic_git.py'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as p:\n",
    "    for line in p.stdout.readlines():\n",
    "        logging.info(line)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'D:\\\\E000-学习资料\\\\E000-学习资料\\\\gitee\\\\play-ground'"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "os.getcwd()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [],
   "source": [
    "os.chdir(\"D:\\E000-学习资料\\E000-学习资料\\gitee\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'D:\\\\E000-学习资料\\\\E000-学习资料\\\\gitee\\\\play-ground'"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dirs + \"\\\\play-ground\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2021-02-13 14:21:37,606 - <ipython-input-109-557295f7c5a4>[line:2] - WARNING: Satrt srcPath: D:\\E000-学习资料\\E000-学习资料\\gitee\n",
      "2021-02-13 14:21:37,612 - <ipython-input-109-557295f7c5a4>[line:12] - WARNING: git status\n",
      "2021-02-13 14:21:37,727 - <ipython-input-109-557295f7c5a4>[line:17] - WARNING: git pull\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "D:\\E000-学习资料\\E000-学习资料\\gitee\\chrome\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2021-02-13 14:21:38,127 - <ipython-input-109-557295f7c5a4>[line:22] - WARNING: git add .\n",
      "2021-02-13 14:21:38,162 - <ipython-input-109-557295f7c5a4>[line:27] - WARNING: git commit -m 2021/02/13 14:21:38 \n",
      "2021-02-13 14:21:38,203 - <ipython-input-109-557295f7c5a4>[line:32] - WARNING: git push\n",
      "2021-02-13 14:21:39,185 - <ipython-input-109-557295f7c5a4>[line:12] - WARNING: git status\n",
      "2021-02-13 14:21:39,248 - <ipython-input-109-557295f7c5a4>[line:17] - WARNING: git pull\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "D:\\E000-学习资料\\E000-学习资料\\gitee\\flask-tutorials\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2021-02-13 14:21:39,608 - <ipython-input-109-557295f7c5a4>[line:22] - WARNING: git add .\n",
      "2021-02-13 14:21:39,659 - <ipython-input-109-557295f7c5a4>[line:27] - WARNING: git commit -m 2021/02/13 14:21:39 \n",
      "2021-02-13 14:21:39,716 - <ipython-input-109-557295f7c5a4>[line:32] - WARNING: git push\n",
      "2021-02-13 14:21:40,572 - <ipython-input-109-557295f7c5a4>[line:12] - WARNING: git status\n",
      "2021-02-13 14:21:40,737 - <ipython-input-109-557295f7c5a4>[line:17] - WARNING: git pull\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "D:\\E000-学习资料\\E000-学习资料\\gitee\\frp-intranet-penetration\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2021-02-13 14:21:41,230 - <ipython-input-109-557295f7c5a4>[line:22] - WARNING: git add .\n",
      "2021-02-13 14:21:41,265 - <ipython-input-109-557295f7c5a4>[line:27] - WARNING: git commit -m 2021/02/13 14:21:41 \n",
      "2021-02-13 14:21:41,304 - <ipython-input-109-557295f7c5a4>[line:32] - WARNING: git push\n",
      "2021-02-13 14:21:42,395 - <ipython-input-109-557295f7c5a4>[line:12] - WARNING: git status\n",
      "2021-02-13 14:21:42,458 - <ipython-input-109-557295f7c5a4>[line:17] - WARNING: git pull\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "D:\\E000-学习资料\\E000-学习资料\\gitee\\operating-system-configuration\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2021-02-13 14:21:42,817 - <ipython-input-109-557295f7c5a4>[line:22] - WARNING: git add .\n",
      "2021-02-13 14:21:42,854 - <ipython-input-109-557295f7c5a4>[line:27] - WARNING: git commit -m 2021/02/13 14:21:42 \n",
      "2021-02-13 14:21:42,896 - <ipython-input-109-557295f7c5a4>[line:32] - WARNING: git push\n",
      "2021-02-13 14:21:43,519 - <ipython-input-109-557295f7c5a4>[line:12] - WARNING: git status\n",
      "2021-02-13 14:21:43,558 - <ipython-input-109-557295f7c5a4>[line:17] - WARNING: git pull\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "D:\\E000-学习资料\\E000-学习资料\\gitee\\play-ground\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2021-02-13 14:21:43,919 - <ipython-input-109-557295f7c5a4>[line:22] - WARNING: git add .\n",
      "2021-02-13 14:21:43,978 - <ipython-input-109-557295f7c5a4>[line:27] - WARNING: git commit -m 2021/02/13 14:21:43 \n",
      "2021-02-13 14:21:44,100 - <ipython-input-109-557295f7c5a4>[line:32] - WARNING: git push\n",
      "2021-02-13 14:21:45,497 - <ipython-input-109-557295f7c5a4>[line:12] - WARNING: git status\n",
      "2021-02-13 14:21:45,537 - <ipython-input-109-557295f7c5a4>[line:17] - WARNING: git pull\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "D:\\E000-学习资料\\E000-学习资料\\gitee\\python3-notebook\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2021-02-13 14:21:45,906 - <ipython-input-109-557295f7c5a4>[line:22] - WARNING: git add .\n",
      "2021-02-13 14:21:45,942 - <ipython-input-109-557295f7c5a4>[line:27] - WARNING: git commit -m 2021/02/13 14:21:45 \n",
      "2021-02-13 14:21:45,983 - <ipython-input-109-557295f7c5a4>[line:32] - WARNING: git push\n",
      "2021-02-13 14:21:46,690 - <ipython-input-109-557295f7c5a4>[line:12] - WARNING: git status\n",
      "2021-02-13 14:21:46,728 - <ipython-input-109-557295f7c5a4>[line:17] - WARNING: git pull\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "D:\\E000-学习资料\\E000-学习资料\\gitee\\RepositoryNodePicgoTypora\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2021-02-13 14:21:47,098 - <ipython-input-109-557295f7c5a4>[line:22] - WARNING: git add .\n",
      "2021-02-13 14:21:47,134 - <ipython-input-109-557295f7c5a4>[line:27] - WARNING: git commit -m 2021/02/13 14:21:47 \n",
      "2021-02-13 14:21:47,173 - <ipython-input-109-557295f7c5a4>[line:32] - WARNING: git push\n",
      "2021-02-13 14:21:48,199 - <ipython-input-109-557295f7c5a4>[line:12] - WARNING: git status\n",
      "2021-02-13 14:21:48,241 - <ipython-input-109-557295f7c5a4>[line:17] - WARNING: git pull\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "D:\\E000-学习资料\\E000-学习资料\\gitee\\scientific-surfing\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2021-02-13 14:21:48,837 - <ipython-input-109-557295f7c5a4>[line:22] - WARNING: git add .\n",
      "2021-02-13 14:21:48,982 - <ipython-input-109-557295f7c5a4>[line:27] - WARNING: git commit -m 2021/02/13 14:21:48 \n",
      "2021-02-13 14:21:49,149 - <ipython-input-109-557295f7c5a4>[line:32] - WARNING: git push\n",
      "2021-02-13 14:21:50,560 - <ipython-input-109-557295f7c5a4>[line:12] - WARNING: git status\n",
      "2021-02-13 14:21:50,735 - <ipython-input-109-557295f7c5a4>[line:17] - WARNING: git pull\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "D:\\E000-学习资料\\E000-学习资料\\gitee\\source-code\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2021-02-13 14:21:51,307 - <ipython-input-109-557295f7c5a4>[line:22] - WARNING: git add .\n",
      "2021-02-13 14:21:51,341 - <ipython-input-109-557295f7c5a4>[line:27] - WARNING: git commit -m 2021/02/13 14:21:51 \n",
      "2021-02-13 14:21:51,383 - <ipython-input-109-557295f7c5a4>[line:32] - WARNING: git push\n",
      "2021-02-13 14:21:52,597 - <ipython-input-109-557295f7c5a4>[line:12] - WARNING: git status\n",
      "2021-02-13 14:21:52,656 - <ipython-input-109-557295f7c5a4>[line:17] - WARNING: git pull\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "D:\\E000-学习资料\\E000-学习资料\\gitee\\tutorials\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2021-02-13 14:21:53,210 - <ipython-input-109-557295f7c5a4>[line:22] - WARNING: git add .\n",
      "2021-02-13 14:21:53,337 - <ipython-input-109-557295f7c5a4>[line:27] - WARNING: git commit -m 2021/02/13 14:21:53 \n",
      "2021-02-13 14:21:53,401 - <ipython-input-109-557295f7c5a4>[line:32] - WARNING: git push\n",
      "2021-02-13 14:21:54,237 - <ipython-input-109-557295f7c5a4>[line:12] - WARNING: git status\n",
      "2021-02-13 14:21:54,279 - <ipython-input-109-557295f7c5a4>[line:17] - WARNING: git pull\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "D:\\E000-学习资料\\E000-学习资料\\gitee\\workspace\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2021-02-13 14:21:54,653 - <ipython-input-109-557295f7c5a4>[line:22] - WARNING: git add .\n",
      "2021-02-13 14:21:54,691 - <ipython-input-109-557295f7c5a4>[line:27] - WARNING: git commit -m 2021/02/13 14:21:54 \n",
      "2021-02-13 14:21:54,739 - <ipython-input-109-557295f7c5a4>[line:32] - WARNING: git push\n",
      "2021-02-13 14:21:55,659 - <ipython-input-109-557295f7c5a4>[line:41] - WARNING: End srcPath: D:\\E000-学习资料\\E000-学习资料\\gitee\n"
     ]
    }
   ],
   "source": [
    "srcPath = os.getcwd()\n",
    "logger.warning(\"Satrt srcPath: \" + srcPath)\n",
    "dirs = \"D:\\\\E000-学习资料\\\\E000-学习资料\\\\gitee\"\n",
    "os.chdir(dirs + \"\\\\play-ground\")\n",
    "# 如果 log文件大于5M， 删除\n",
    "if os.path.getsize(\"automatic_git.log\")/1024/1024 > 5:\n",
    "    try:\n",
    "        os.remove(\"automatic_git.log\")\n",
    "    except Exception as e:\n",
    "        logger.error(e)\n",
    "#         sys.exit()\n",
    "for dir_ in os.listdir(\"D:\\\\E000-学习资料\\\\E000-学习资料\\\\gitee\"):\n",
    "    if os.path.isdir(os.path.join(dirs,dir_)):\n",
    "        if  \".git\" in os.listdir(os.path.join(dirs, dir_)):\n",
    "            os.chdir(os.path.join(dirs, dir_))\n",
    "            print(os.getcwd())\n",
    "            logger.info(\"当前目录:\\n\" + os.getcwd())\n",
    "#             logger.info(__file__)\n",
    "\n",
    "            logger.warning('git status')\n",
    "            with subprocess.Popen(['git', 'status'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as p:\n",
    "                for line in p.stdout.readlines():\n",
    "                    logger.info(line)\n",
    "\n",
    "            logger.warning('git pull')\n",
    "            with subprocess.Popen(['git', 'pull'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as p:\n",
    "                for line in p.stdout.readlines():\n",
    "                    logger.info(line)\n",
    "                    \n",
    "            logger.warning('git add .')\n",
    "            with subprocess.Popen(['git', 'add', '.'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as p:\n",
    "                for line in p.stdout.readlines():\n",
    "                    logger.info(line)\n",
    "\n",
    "            logger.warning('git commit -m {} '.format(datetime.datetime.strftime(datetime.datetime.now(), '%Y/%m/%d %H:%M:%S')))\n",
    "            with subprocess.Popen(['git', \"commit\", \"-m\",  datetime.datetime.strftime(datetime.datetime.now(), '%Y/%m/%d %H:%M:%S')], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as p:\n",
    "                for line in p.stdout.readlines():\n",
    "                    logger.info(line)\n",
    "\n",
    "            logger.warning('git push')\n",
    "            with subprocess.Popen(['git', 'push'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as p:\n",
    "                for line in p.stdout.readlines():\n",
    "                    logger.info(line)\n",
    "        else:\n",
    "            continue\n",
    "    else:\n",
    "        continue\n",
    "os.chdir(srcPath)\n",
    "logger.warning(\"End srcPath: \" + srcPath)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'D:\\\\E000-学习资料\\\\E000-学习资料\\\\gitee\\\\play-ground'"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "os.getcwd()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [],
   "source": [
    "os.chdir('D://E000-学习资料//E000-学习资料//gitee/play-ground/')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "84.3857421875"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "86411/1024"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "os.path.getsize(\"automatic_git.log\")/1024/1024 > 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "os.chdir()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [],
   "source": [
    "from dir_objectName import dir_objectName"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[41m1@@\u001b[0mDirEntry                      \u001b[41m2@@\u001b[0mF_OK                          \u001b[41m3@@\u001b[0mMutableMapping                \u001b[41m4@@\u001b[0mO_APPEND                      \n",
      "\u001b[41m5@@\u001b[0mO_BINARY                      \u001b[41m6@@\u001b[0mO_CREAT                       \u001b[41m7@@\u001b[0mO_EXCL                        \u001b[41m8@@\u001b[0mO_NOINHERIT                   \n",
      "\u001b[41m9@@\u001b[0mO_RANDOM                      \u001b[41m10@\u001b[0mO_RDONLY                      \u001b[41m11@\u001b[0mO_RDWR                        \u001b[41m12@\u001b[0mO_SEQUENTIAL                  \n",
      "\u001b[41m13@\u001b[0mO_SHORT_LIVED                 \u001b[41m14@\u001b[0mO_TEMPORARY                   \u001b[41m15@\u001b[0mO_TEXT                        \u001b[41m16@\u001b[0mO_TRUNC                       \n",
      "\u001b[41m17@\u001b[0mO_WRONLY                      \u001b[41m18@\u001b[0mP_DETACH                      \u001b[41m19@\u001b[0mP_NOWAIT                      \u001b[41m20@\u001b[0mP_NOWAITO                     \n",
      "\u001b[41m21@\u001b[0mP_OVERLAY                     \u001b[41m22@\u001b[0mP_WAIT                        \u001b[41m23@\u001b[0mPathLike                      \u001b[41m24@\u001b[0mR_OK                          \n",
      "\u001b[41m25@\u001b[0mSEEK_CUR                      \u001b[41m26@\u001b[0mSEEK_END                      \u001b[41m27@\u001b[0mSEEK_SET                      \u001b[41m28@\u001b[0mTMP_MAX                       \n",
      "\u001b[41m29@\u001b[0mW_OK                          \u001b[41m30@\u001b[0mX_OK                          \u001b[41m51@\u001b[0mabc                           \u001b[41m52@\u001b[0mabort                         \n",
      "\u001b[41m53@\u001b[0maccess                        \u001b[41m54@\u001b[0madd_dll_directory             \u001b[41m55@\u001b[0maltsep                        \u001b[41m56@\u001b[0mchdir                         \n",
      "\u001b[41m57@\u001b[0mchmod                         \u001b[41m58@\u001b[0mclose                         \u001b[41m59@\u001b[0mcloserange                    \u001b[41m60@\u001b[0mcpu_count                     \n",
      "\u001b[41m61@\u001b[0mcurdir                        \u001b[41m62@\u001b[0mdefpath                       \u001b[41m63@\u001b[0mdevice_encoding               \u001b[41m64@\u001b[0mdevnull                       \n",
      "\u001b[41m65@\u001b[0mdup                           \u001b[41m66@\u001b[0mdup2                          \u001b[41m67@\u001b[0menviron                       \u001b[41m68@\u001b[0merror                         \n",
      "\u001b[41m69@\u001b[0mexecl                         \u001b[41m70@\u001b[0mexecle                        \u001b[41m71@\u001b[0mexeclp                        \u001b[41m72@\u001b[0mexeclpe                       \n",
      "\u001b[41m73@\u001b[0mexecv                         \u001b[41m74@\u001b[0mexecve                        \u001b[41m75@\u001b[0mexecvp                        \u001b[41m76@\u001b[0mexecvpe                       \n",
      "\u001b[41m77@\u001b[0mextsep                        \u001b[41m78@\u001b[0mfdopen                        \u001b[41m79@\u001b[0mfsdecode                      \u001b[41m80@\u001b[0mfsencode                      \n",
      "\u001b[41m81@\u001b[0mfspath                        \u001b[41m82@\u001b[0mfstat                         \u001b[41m83@\u001b[0mfsync                         \u001b[41m84@\u001b[0mftruncate                     \n",
      "\u001b[41m85@\u001b[0mget_exec_path                 \u001b[41m86@\u001b[0mget_handle_inheritable        \u001b[41m87@\u001b[0mget_inheritable               \u001b[41m88@\u001b[0mget_terminal_size             \n",
      "\u001b[41m89@\u001b[0mgetcwd                        \u001b[41m90@\u001b[0mgetcwdb                       \u001b[41m91@\u001b[0mgetenv                        \u001b[41m92@\u001b[0mgetlogin                      \n",
      "\u001b[41m93@\u001b[0mgetpid                        \u001b[41m94@\u001b[0mgetppid                       \u001b[41m95@\u001b[0misatty                        \u001b[41m96@\u001b[0mkill                          \n",
      "\u001b[41m97@\u001b[0mlinesep                       \u001b[41m98@\u001b[0mlink                          \u001b[41m99@\u001b[0mlistdir                       \u001b[41m100\u001b[0mlseek                         \n",
      "\u001b[41m101\u001b[0mlstat                         \u001b[41m102\u001b[0mmakedirs                      \u001b[41m103\u001b[0mmkdir                         \u001b[41m104\u001b[0mname                          \n",
      "\u001b[41m105\u001b[0mopen                          \u001b[41m106\u001b[0mpardir                        \u001b[41m107\u001b[0mpath                          \u001b[41m108\u001b[0mpathsep                       \n",
      "\u001b[41m109\u001b[0mpipe                          \u001b[41m110\u001b[0mpopen                         \u001b[41m111\u001b[0mputenv                        \u001b[41m112\u001b[0mread                          \n",
      "\u001b[41m113\u001b[0mreadlink                      \u001b[41m114\u001b[0mremove                        \u001b[41m115\u001b[0mremovedirs                    \u001b[41m116\u001b[0mrename                        \n",
      "\u001b[41m117\u001b[0mrenames                       \u001b[41m118\u001b[0mreplace                       \u001b[41m119\u001b[0mrmdir                         \u001b[41m120\u001b[0mscandir                       \n",
      "\u001b[41m121\u001b[0msep                           \u001b[41m122\u001b[0mset_handle_inheritable        \u001b[41m123\u001b[0mset_inheritable               \u001b[41m124\u001b[0mspawnl                        \n",
      "\u001b[41m125\u001b[0mspawnle                       \u001b[41m126\u001b[0mspawnv                        \u001b[41m127\u001b[0mspawnve                       \u001b[41m128\u001b[0mst                            \n",
      "\u001b[41m129\u001b[0mstartfile                     \u001b[41m130\u001b[0mstat                          \u001b[41m131\u001b[0mstat_result                   \u001b[41m132\u001b[0mstatvfs_result                \n",
      "\u001b[41m133\u001b[0mstrerror                      \u001b[41m134\u001b[0msupports_bytes_environ        \u001b[41m135\u001b[0msupports_dir_fd               \u001b[41m136\u001b[0msupports_effective_ids        \n",
      "\u001b[41m137\u001b[0msupports_fd                   \u001b[41m138\u001b[0msupports_follow_symlinks      \u001b[41m139\u001b[0msymlink                       \u001b[41m140\u001b[0msys                           \n",
      "\u001b[41m141\u001b[0msystem                        \u001b[41m142\u001b[0mterminal_size                 \u001b[41m143\u001b[0mtimes                         \u001b[41m144\u001b[0mtimes_result                  \n",
      "\u001b[41m145\u001b[0mtruncate                      \u001b[41m146\u001b[0mumask                         \u001b[41m147\u001b[0muname_result                  \u001b[41m148\u001b[0munlink                        \n",
      "\u001b[41m149\u001b[0murandom                       \u001b[41m150\u001b[0mutime                         \u001b[41m151\u001b[0mwaitpid                       \u001b[41m152\u001b[0mwalk                          \n",
      "\u001b[41m153\u001b[0mwrite                         "
     ]
    }
   ],
   "source": [
    "dir_objectName(os)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[41m18@\u001b[0mabspath                       \u001b[41m19@\u001b[0maltsep                        \u001b[41m20@\u001b[0mbasename                      \n",
      "\u001b[41m21@\u001b[0mcommonpath                    \u001b[41m22@\u001b[0mcommonprefix                  \u001b[41m23@\u001b[0mcurdir                        \u001b[41m24@\u001b[0mdefpath                       \n",
      "\u001b[41m25@\u001b[0mdevnull                       \u001b[41m26@\u001b[0mdirname                       \u001b[41m27@\u001b[0mexists                        \u001b[41m28@\u001b[0mexpanduser                    \n",
      "\u001b[41m29@\u001b[0mexpandvars                    \u001b[41m30@\u001b[0mextsep                        \u001b[41m31@\u001b[0mgenericpath                   \u001b[41m32@\u001b[0mgetatime                      \n",
      "\u001b[41m33@\u001b[0mgetctime                      \u001b[41m34@\u001b[0mgetmtime                      \u001b[41m35@\u001b[0mgetsize                       \u001b[41m36@\u001b[0misabs                         \n",
      "\u001b[41m37@\u001b[0misdir                         \u001b[41m38@\u001b[0misfile                        \u001b[41m39@\u001b[0mislink                        \u001b[41m40@\u001b[0mismount                       \n",
      "\u001b[41m41@\u001b[0mjoin                          \u001b[41m42@\u001b[0mlexists                       \u001b[41m43@\u001b[0mnormcase                      \u001b[41m44@\u001b[0mnormpath                      \n",
      "\u001b[41m45@\u001b[0mos                            \u001b[41m46@\u001b[0mpardir                        \u001b[41m47@\u001b[0mpathsep                       \u001b[41m48@\u001b[0mrealpath                      \n",
      "\u001b[41m49@\u001b[0mrelpath                       \u001b[41m50@\u001b[0msamefile                      \u001b[41m51@\u001b[0msameopenfile                  \u001b[41m52@\u001b[0msamestat                      \n",
      "\u001b[41m53@\u001b[0msep                           \u001b[41m54@\u001b[0msplit                         \u001b[41m55@\u001b[0msplitdrive                    \u001b[41m56@\u001b[0msplitext                      \n",
      "\u001b[41m57@\u001b[0mstat                          \u001b[41m58@\u001b[0msupports_unicode_filenames    \u001b[41m59@\u001b[0msys                           "
     ]
    }
   ],
   "source": [
    "dir_objectName(os.path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[41m24@\u001b[0maddaudithook                  \n",
      "\u001b[41m25@\u001b[0mapi_version                   \u001b[41m26@\u001b[0margv                          \u001b[41m27@\u001b[0maudit                         \u001b[41m28@\u001b[0mbase_exec_prefix              \n",
      "\u001b[41m29@\u001b[0mbase_prefix                   \u001b[41m30@\u001b[0mbreakpointhook                \u001b[41m31@\u001b[0mbuiltin_module_names          \u001b[41m32@\u001b[0mbyteorder                     \n",
      "\u001b[41m33@\u001b[0mcall_tracing                  \u001b[41m34@\u001b[0mcallstats                     \u001b[41m35@\u001b[0mcopyright                     \u001b[41m36@\u001b[0mdisplayhook                   \n",
      "\u001b[41m37@\u001b[0mdllhandle                     \u001b[41m38@\u001b[0mdont_write_bytecode           \u001b[41m39@\u001b[0mexc_info                      \u001b[41m40@\u001b[0mexcepthook                    \n",
      "\u001b[41m41@\u001b[0mexec_prefix                   \u001b[41m42@\u001b[0mexecutable                    \u001b[41m43@\u001b[0mexit                          \u001b[41m44@\u001b[0mflags                         \n",
      "\u001b[41m45@\u001b[0mfloat_info                    \u001b[41m46@\u001b[0mfloat_repr_style              \u001b[41m47@\u001b[0mget_asyncgen_hooks            \u001b[41m48@\u001b[0mget_coroutine_origin_tracking_depth\n",
      "\u001b[41m49@\u001b[0mgetallocatedblocks            \u001b[41m50@\u001b[0mgetcheckinterval              \u001b[41m51@\u001b[0mgetdefaultencoding            \u001b[41m52@\u001b[0mgetfilesystemencodeerrors     \n",
      "\u001b[41m53@\u001b[0mgetfilesystemencoding         \u001b[41m54@\u001b[0mgetprofile                    \u001b[41m55@\u001b[0mgetrecursionlimit             \u001b[41m56@\u001b[0mgetrefcount                   \n",
      "\u001b[41m57@\u001b[0mgetsizeof                     \u001b[41m58@\u001b[0mgetswitchinterval             \u001b[41m59@\u001b[0mgettrace                      \u001b[41m60@\u001b[0mgetwindowsversion             \n",
      "\u001b[41m61@\u001b[0mhash_info                     \u001b[41m62@\u001b[0mhexversion                    \u001b[41m63@\u001b[0mimplementation                \u001b[41m64@\u001b[0mint_info                      \n",
      "\u001b[41m65@\u001b[0mintern                        \u001b[41m66@\u001b[0mis_finalizing                 \u001b[41m67@\u001b[0mlast_traceback                \u001b[41m68@\u001b[0mlast_type                     \n",
      "\u001b[41m69@\u001b[0mlast_value                    \u001b[41m70@\u001b[0mmaxsize                       \u001b[41m71@\u001b[0mmaxunicode                    \u001b[41m72@\u001b[0mmeta_path                     \n",
      "\u001b[41m73@\u001b[0mmodules                       \u001b[41m74@\u001b[0mpath                          \u001b[41m75@\u001b[0mpath_hooks                    \u001b[41m76@\u001b[0mpath_importer_cache           \n",
      "\u001b[41m77@\u001b[0mplatform                      \u001b[41m78@\u001b[0mprefix                        \u001b[41m79@\u001b[0mps1                           \u001b[41m80@\u001b[0mps2                           \n",
      "\u001b[41m81@\u001b[0mps3                           \u001b[41m82@\u001b[0mpycache_prefix                \u001b[41m83@\u001b[0mset_asyncgen_hooks            \u001b[41m84@\u001b[0mset_coroutine_origin_tracking_depth\n",
      "\u001b[41m85@\u001b[0msetcheckinterval              \u001b[41m86@\u001b[0msetprofile                    \u001b[41m87@\u001b[0msetrecursionlimit             \u001b[41m88@\u001b[0msetswitchinterval             \n",
      "\u001b[41m89@\u001b[0msettrace                      \u001b[41m90@\u001b[0mstderr                        \u001b[41m91@\u001b[0mstdin                         \u001b[41m92@\u001b[0mstdout                        \n",
      "\u001b[41m93@\u001b[0mthread_info                   \u001b[41m94@\u001b[0munraisablehook                \u001b[41m95@\u001b[0mversion                       \u001b[41m96@\u001b[0mversion_info                  \n",
      "\u001b[41m97@\u001b[0mwarnoptions                   \u001b[41m98@\u001b[0mwinver                        "
     ]
    }
   ],
   "source": [
    "import sys\n",
    "dir_objectName(sys)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {
    "height": "422px",
    "width": "348px"
   },
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "757px",
    "left": "26px",
    "top": "134px",
    "width": "281.75px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
